<?php
class Integrator
{
  protected $dimx,$dimy,$function_x;
  
  function Integrator($dimx, $dimy, $x_start, $x_end, $br, $bg, $bb, $ar, $ag, $ab, $function_x, $step, $hasgrid)
  {
    $this->sum        =       0;
    $this->dimx       = (int) $dimx;
    $this->dimy       = (int) $dimy;
    $this->x_start    = (int) $x_start;
	$this->x_end      = (int) $x_end;
	
	$this->br         = (int) $br;
	$this->bg         = (int) $bg;
	$this->bb         = (int) $bb;
	
	$this->ar         = (int) $ar;
	$this->ag         = (int) $ag;
	$this->ab         = (int) $ab;
	
	$this->function_x =       $function_x;
	$this->step       = (real)$step;
	$this->hasgrid    =       $hasgrid;
  }

  protected function setVarXtoFunction()
  {
    $this->function_x = str_replace('x','$x',$this->function_x);
  }
  protected  function validateSintaxisOfFunction()
  {
    if(substr_count($this->function_x,'(') != substr_count($this->function_x,')'))
	{
      header("Location: index.html");
	  die();
	}
  }
  
  protected function yscale()
  {
    if((substr_count($this->function_x,'sin')>0)||(substr_count($this->function_x,'cos')>0))
	  return(100);
	else
	  return(1);
  }
  
  protected function calculateIntegral()
  {
    for( $x = $this->x_start ; $x < $this->x_end ; $x += $this->step )
	{
		
	  eval('$first='.$this->function_x.';');
	  $x += $this->step;
	  eval('$second='.$this->function_x.';');
	  $x -= $this->step;
	  $this->sum += ( ( (real)$second + (real)$first )*(real)$this->step/ 2 );
	}
  }
  
  public function drawFunctionAndShowIntegral()
  {
    header("Content-type: image/jpeg");
	$image = imagecreate($this->dimx, $this->dimy);
	$col   = imagecolorallocate($image,$this->br,$this->bg,$this->bb);
    $col1  = imagecolorallocate($image,$this->ar,$this->ag,$this->ab);
	$grcol = imagecolorallocate($image,8,100,8);
    
	$this->validateSintaxisOfFunction();
	$this->setVarXtoFunction();
	$this->calculateIntegral();
	/*
	if($this->hasgrid == '1')
	{
      //---- vertical grids.
      for( $i = 0 ; $i < $this->dimx ; $i += 10 )
	    imageline($image,$i,0,$i,$this->dimy,$grcol);
    
	  //---- horizontal grids.
	  for($i=0;$i<$this->dimy;$i+=10)
	    imageline($image,0,$i,$this->dimx,$i,$grcol);
	}*/
    
	imageline($image, $this->dimx/2, 0            , $this->dimx/2, $this->dimy  , $col1);
	imageline($image, 0            , $this->dimy/2, $this->dimx  , $this->dimy/2, $col1);

	$j=0;
	
	for( $x =- $this->dimx/2 ; $x < $this->dimx/2 ; $x += $this->step )
    {
	  if(($x > $this->x_start && $x < $this->x_end) && $x%2 == 0)
	  {
	    imageline($image, $this->x_points[$j]+$this->dimx/2, ($this->y_points[$j]*(-1))+$this->dimy/2, $this->x_points[$j]+$this->dimx/2, $this->dimy/2-1, $grcol);
	  }
	  
	  eval('$this->x_points[$j]= $x ;');
	  eval('$this->y_points[$j]='.$this->yscale().'*'.$this->function_x.';');
	  imagesetpixel($image,$this->x_points[$j]+$this->dimx/2,($this->y_points[$j]*(-1))+$this->dimy/2 , $col1);			

    }
	//resultado
    imagestring ($image, 2, 40, $this->dimy-35, $this->x_start, $col1);
    imagestring ($image, 2, 20, $this->dimy-25, "sum(".str_replace('$x','x',$this->function_x).')= '.$this->sum, $col1);
    imagestring ($image, 2, 40, $this->dimy-15, $this->x_end, $col1);
    imagejpeg($image,"",100);
  }
}

?>